package de.hypoport.einarbeitung.scrumspirit.integrationtest;

import java.io.File;

import org.openqa.selenium.server.RemoteControlConfiguration;
import org.openqa.selenium.server.SeleniumServer;

import com.thoughtworks.selenium.DefaultSelenium;
import com.thoughtworks.selenium.SeleneseTestBase;

/**
 * Selenium Test als Unittest
 * Durch die Kategorie werden diese Unittests nicht in der mvn test phase ausgeführt
 * dies ist alles inb der pom.xml konfiguriert.
 * 
 * @see http://johndobie.blogspot.co.uk/2012/04/unit-and-integration-tests-with-maven.html
 *      surefire wird dafür verwendet und konfigriert.
 *      für den Selenium tests werden die 3 integrationstest phasen konfoguriert
 * @see http://mojo.codehaus.org/selenium-maven-plugin/examples/using-with-surefire.html
 * 
 *      firefox muss im PATH sein
 *      Außerdem empfielt es sich ein Firefox Profil zu erstellen und damit selenium Tests durchzuführen
 * 
 *      und unter Windows kann es wegen lock files zu Problemen kommen
 * @see http://selenium-grid.seleniumhq.org/faq.html#
 *      when_starting_firefox_i_get_java_javalangruntimeexception_firefox_refused_shutdown_while_preparing_a_profile
 * 
 */
public class MitarbeiterAnlegenSelenium extends SeleneseTestBase {

	public static void main(String[] args) throws Exception {
		MitarbeiterAnlegenSelenium m = new MitarbeiterAnlegenSelenium();
		m.startIntegrationTest();
	}

	private SeleniumServer server;
	private static int port = 4444;

	private void startIntegrationTest() throws Exception {

		RemoteControlConfiguration conf = new RemoteControlConfiguration();
		conf.setPort(port);
		conf.setFirefoxProfileTemplate(new File(
				"C:/entwicklung/Scrum-Spirit/Scrum-Spirit/src/test/resources/selenium/ffprofile"));
		server = new SeleniumServer(false, conf);
		server.start();

		setUp();
		testMitarbeiterAnlegenITest();
		tearDown();
		server.stop();
	}

	DefaultSelenium selenium;

	// WebDriver driver;

	private boolean isWindows() {
		String osarch = System.getProperty("os.arch");
		String osname = System.getProperty("os.name");
		// 		String version = System.getProperty("os.version");

		if (osarch.equals("x86") && osname.contains("Windows")) {
			return true;
		}
		return false;
	}

	@Override
	public void setUp() throws Exception {
		String firefoxprogram;
		if (isWindows()) {
			// Das geht, weil die Software für Windows ueber Empirum gepflegt wird.
			// firefoxprogram = "C:/Program Files (x86)/Mozilla Firefox/firefox.exe";
			firefoxprogram = "*chrome";
		} else {
			firefoxprogram = "*chrome";
		}

		selenium = new DefaultSelenium("localhost", port, firefoxprogram, "http://localhost:8080/");
		selenium.start();

		//		driver = new FirefoxDriver();
		//		driver.get("http://customers.qa.hypoport.local:91/ecu2-app/rk?p_prodId=UFNE&p_finbetrag=5000&p_laufzeit=24");
	}

	//	private void driverTest() {
	//		String url = driver.getCurrentUrl();
	//	}

	/**
	 * selenium integration test
	 */
	public void testMitarbeiterAnlegenITest() throws Exception {
		selenium.open("/");
		verifyTrue(selenium.isTextPresent("Wicket Quickstart Archetype Homepage"));
		assertTrue(selenium.isElementPresent("link=alle"));
		assertTrue(selenium.isElementPresent("link=Mitarbeiter"));
		selenium.click("link=Mitarbeiter");
		selenium.waitForPageToLoad("30000");
		selenium.type("name=VornameInput", "Martin");
		selenium.type("name=NachnameInput", "Mustermann");
		selenium.type("name=EmailInput", "mm@tester.de");
		selenium.click("id=submit3");
		selenium.waitForPageToLoad("30000");
		verifyTrue(selenium.isTextPresent("anzeigen"));
		selenium.click("link=alle");
		selenium.waitForPageToLoad("30000");
		verifyTrue(selenium.isTextPresent("Martin"));
		verifyTrue(selenium.isTextPresent("Mustermann"));
		assertTrue(selenium.isElementPresent("id=editbuttonc"));
		selenium.click("id=editbuttonc");
		selenium.waitForPageToLoad("30000");
		verifyEquals("Martin", selenium.getValue("name=VornameInput"));
		verifyEquals("Mustermann", selenium.getValue("name=NachnameInput"));
		verifyEquals("mm@tester.de", selenium.getValue("name=EmailInput"));
		selenium.type("name=VornameInput", "Martin Maria");
		selenium.click("id=submitf");
		selenium.waitForPageToLoad("30000");
		selenium.click("link=alle");
		selenium.waitForPageToLoad("30000");
		verifyTrue(selenium.isTextPresent("Maria"));
	}

	@Override
	public void tearDown() throws Exception {
		selenium.stop();
	}
}
